ci(release): restore the revert and feature changelog sections - #435
Merged
Conversation
`changelog-sections` replaces the preset's default type list wholesale rather than extending it, so every type absent from ours resolves to nothing. Ours listed nine; two of the five the preset shows were missing. Verified against the preset release-please actually loads — the action is pinned to v5.0.0, whose lockfile resolves release-please 17.6.0 and conventional-changelog-conventionalcommits 6.1.0. There the defaults are an inline array in `writer-opts.js` -> `defaultConfig()`, keyed `hidden: true`; feat, feature, fix, perf and revert are visible, the other seven hidden. (Newer 10.x renamed that key to `effect`. Writing `effect` into this file would be a silent no-op here, so the citation matters.) `revert` is the one that counts. A revert is exactly the news a consumer has to see, and it rendered nothing. Two `Revert "..."` commits do exist — 8b774dc and 2cc874e, both 2025-01-10 — and neither reached a changelog; but both predate `bootstrap-sha`, and this config has produced exactly one release, so no published changelog is missing anything. `feature` is the sharper case. `DefaultVersioningStrategy` bumps on `type === 'feat' || type === 'feature'` regardless of this list, so a `feature:` commit already cuts a minor release while contributing no changelog line — the version moves and nothing explains why. Scope, stated rather than implied: this reaches conventional `revert:` and `revert(scope):` subjects only. Plain `git revert` produces `Revert "..."`, which release-please's parser rejects outright, and squash-merging a revert PR makes that the subject. Those stay invisible. Documenting the `revert:`-prefixed subject in releasing.md is the follow-up that makes this section reachable. `style` stays out, but not for the reason first given here. Listing a type and omitting it are not equivalent: a listed entry arrives without the `hidden` flag and prints, and — the part that matters — an omitted type skips the `if (entry)` section rewrite, so a breaking commit of that type hoists a raw lowercase heading above Features, `indexOf` returning -1. That hole is not specific to `style`: twelve types in this history are unconfigured, `playground` (31) and `doc` (23) ahead of it. Fixing one of twelve here would be arbitrary; filed separately instead. No live defect — all 30 breaking commits so far are of configured types. Section order is the array's own, so Reverts lands after Performance and above the docs/tests/chore block. Only the head matches the preset's ordering; our tail already differed and is untouched. Closes #434.
IgorShevchik
force-pushed
the
fix/changelog-sections-revert
branch
from
August 19, 2026 13:04
6c0e8df to
1e79458
Compare
revert and feature changelog sectionsrevert and feature changelog sections
This was referenced Aug 19, 2026
Closed
8 tasks
IgorShevchik
pushed a commit
that referenced
this pull request
Aug 20, 2026
…orrect the pipeline's own account of itself Five review passes found the first version of this change wrong in ways that mattered, including one place where it told the reader the opposite of what they would be looking at. This is the corrected version, and it fixes the false claims the pipeline makes about itself rather than only adding true ones beside them. **The symptom is stated correctly now.** The release PR sits at `blocked` while its `ci` check is **green** — the green one is the dispatched run; a separate `pull_request` run is held at `action_required`, creates no jobs and therefore no check run, and is what branch protection is waiting on. The first version said "blocked with no `ci` check", which is what the API contradicts and which would have sent a reader to the wrong remedy, since a green check with a refused merge is also what a stale branch looks like. Both causes are now listed, in the order to check them, with the literal error string a person will search on. **The click is documented as a procedure with an order.** Actions → the held run is the primary route; the Checks tab is not, because a held run renders nothing there. Approval attaches to a run and a run to a commit, so any push to `main` strands it — up to nine held runs in a day here — which makes approve-then-merge a race, not a sequence, and merges to `main` have to pause while it runs. **Two workflow comments asserted the mechanism this document refutes.** Both `ci.yml` and `release-please.yml` claimed a `GITHUB_TOKEN` PR fires no pull_request event and that the dispatched run satisfies the required check. Neither is true, and they are the files a person opens first. Corrected and pointed at the new section, as `release-watchdog.yml` already does for the cadence commitment. **The revert guidance now names where the subject is actually set.** Retitling the PR is not sufficient: a revert PR is always a single commit, and for those the squash subject may come from the commit rather than the title. The squash-merge dialog is the route that works either way. Recorded too: the parse failure prints in the Release Please job log (it is invisible, not absent), a `Revert "…"` that is the only commit since the last tag opens no release PR at all, and a `revert:` does not cancel the `feat:` it undoes — both ship, and the release is still a minor. The two `Revert "…"` commits in this history are no longer offered as evidence of harm. They predate `bootstrap-sha` and the CHANGELOG's first entry, which the #435 commit message already said and this one had dropped. The sample under release-please is zero; that is now stated plainly. **The template is where the trap is catchable.** GitHub's revert button opens the PR form with `Revert "…"` already in the title box, so the instruction goes there as well as in the guides nobody has open at that moment. The watchdog's nudge — which reaches a maintainer exactly when their release PR is stuck — now links the section instead of only saying "merge it". Also corrected in passing: the file claimed under Optional hardening that merging is "the only human step", contradicting its own opening; the `severity:crash` paragraph existed twice; a cross-reference pointed at the wrong promise; two paragraphs about release cadence had been orphaned under a heading about repository settings; branch protection was missing from the list of settings the pipeline depends on; and the break-glass omitted `dev:prepare` and `--no-git-checks`, without which it ships a tarball missing a file `package.json` lists. The "no workflow-file fix" claim is softened to "none worth taking", because one does work: a workflow can `POST /statuses/{sha}` with `context: ci`. It is refused on purpose — it fabricates the signal the gate carries — and the reason is now recorded next to the trick. `merge_group` and the Actions approval setting are listed as unexplored rather than impossible. Closes #353.
IgorShevchik
pushed a commit
that referenced
this pull request
Aug 20, 2026
…orrect the pipeline's own account of itself Five review passes found the first version of this change wrong in ways that mattered, including one place where it told the reader the opposite of what they would be looking at. This is the corrected version, and it fixes the false claims the pipeline makes about itself rather than only adding true ones beside them. **The symptom is stated correctly now.** The release PR sits at `blocked` while its `ci` check is **green** — the green one is the dispatched run; a separate `pull_request` run is held at `action_required`, creates no jobs and therefore no check run, and is what branch protection is waiting on. The first version said "blocked with no `ci` check", which is what the API contradicts and which would have sent a reader to the wrong remedy, since a green check with a refused merge is also what a stale branch looks like. Both causes are now listed, in the order to check them, with the literal error string a person will search on. **The click is documented as a procedure with an order.** Actions → the held run is the primary route; the Checks tab is not, because a held run renders nothing there. Approval attaches to a run and a run to a commit, so any push to `main` strands it — up to nine held runs in a day here — which makes approve-then-merge a race, not a sequence, and merges to `main` have to pause while it runs. **Two workflow comments asserted the mechanism this document refutes.** Both `ci.yml` and `release-please.yml` claimed a `GITHUB_TOKEN` PR fires no pull_request event and that the dispatched run satisfies the required check. Neither is true, and they are the files a person opens first. Corrected and pointed at the new section, as `release-watchdog.yml` already does for the cadence commitment. **The revert guidance now names where the subject is actually set.** Retitling the PR is not sufficient: a revert PR is always a single commit, and for those the squash subject may come from the commit rather than the title. The squash-merge dialog is the route that works either way. Recorded too: the parse failure prints in the Release Please job log (it is invisible, not absent), a `Revert "…"` that is the only commit since the last tag opens no release PR at all, and a `revert:` does not cancel the `feat:` it undoes — both ship, and the release is still a minor. The two `Revert "…"` commits in this history are no longer offered as evidence of harm. They predate `bootstrap-sha` and the CHANGELOG's first entry, which the #435 commit message already said and this one had dropped. The sample under release-please is zero; that is now stated plainly. **The template is where the trap is catchable.** GitHub's revert button opens the PR form with `Revert "…"` already in the title box, so the instruction goes there as well as in the guides nobody has open at that moment. The watchdog's nudge — which reaches a maintainer exactly when their release PR is stuck — now links the section instead of only saying "merge it". Also corrected in passing: the file claimed under Optional hardening that merging is "the only human step", contradicting its own opening; the `severity:crash` paragraph existed twice; a cross-reference pointed at the wrong promise; two paragraphs about release cadence had been orphaned under a heading about repository settings; branch protection was missing from the list of settings the pipeline depends on; and the break-glass omitted `dev:prepare` and `--no-git-checks`, without which it ships a tarball missing a file `package.json` lists. The "no workflow-file fix" claim is softened to "none worth taking", because one does work: a workflow can `POST /statuses/{sha}` with `context: ci`. It is refused on purpose — it fabricates the signal the gate carries — and the reason is now recorded next to the trick. `merge_group` and the Actions approval setting are listed as unexplored rather than impossible. Closes #353.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linked issue
Closes #434.
Type of change
Description
changelog-sectionsreplaces the preset's default type list wholesale rather than extending it, so any type absent from ours resolves to nothing. Ours listed nine; two of the five the preset shows were missing.{ "type": "feat", "section": "Features" }, + { "type": "feature", "section": "Features" }, { "type": "fix", "section": "Bug Fixes" }, { "type": "perf", "section": "Performance" }, + { "type": "revert", "section": "Reverts" }, { "type": "docs", "section": "Docs" },Which preset, exactly
Corrected from the first revision of this description, which cited
conventional-changelog-conventionalcommits@10.3.0and itseffect: 'bump' | 'hidden'key. That is not what runs here. The action is pinned torelease-please-action@v5.0.0, whose lockfile resolvesrelease-please@17.6.0→conventional-changelog-conventionalcommits@6.1.0. Grepping the shippeddist/index.jsat the pinned SHA finds zero occurrences ofDEFAULT_COMMIT_TYPESoreffect: 'bump'.In 6.1.0 the defaults are an inline array in
writer-opts.js→defaultConfig(), keyedhidden: true:feat,featurefixperfrevertdocs,style,chore,refactor,test,build,cihidden: trueMembership is identical in 6.x and 10.x, so the conclusion is unchanged — but the key name is not, and writing
effectinto this file would be a silent no-op. The citation matters for anyone re-deriving this.Why each line
revert— a revert is exactly the news a consumer has to see, and it rendered nothing.featureis the sharper case, and it is not about the changelog at all.DefaultVersioningStrategybumps oncommit.type === 'feat' || commit.type === 'feature', and it never seeschangelog-sections. So afeature:commit already cuts a minor release while contributing no changelog line — the version moves and nothing explains why.Nothing published is missing anything — but not for the reason first given
The earlier claim was "zero
revert:commits in this history, so nothing published is missing anything". The count is right (^revert(\(|!|:)→ 0,feature→ 0). The inference was a non-sequitur that happened to land correctly.Two GitHub-style reverts do exist —
8b774dcdand2cc874e2, both 2025-01-10, both shipped in v0.1.3, neither inCHANGELOG.md. What actually saves the conclusion: both predatebootstrap-sha(ae76be29, 2026-08-06), andrelease-please-config.jsononly landed 2026-08-08, so this config has produced exactly one release — 2.11.0 — containing no revert of any form.Scope, stated rather than implied
This reaches conventional
revert:/revert(scope):subjects only.Plain
git revertproducesRevert "<original subject>", which release-please's parser rejects outright (unexpected token ' ' at 1:7) and discards silently. Since this repo squash-merges, a revert PR's auto-generated title becomes the subject verbatim — so the realistic revert form stays invisible after this change. Both existing reverts are of that form.releasing.mdprescribes exactly that path ("revert it, ship the patch, re-land it afterwards") without saying the subject must readrevert:. Documenting it there is the follow-up that makes this section reachable; filed rather than bundled here.stylestays out — corrected reasoningThe first revision said "the preset hides
styleby default, so listing or omitting it produce the same empty output". That is wrong, and it contradicted this PR's own thesis one paragraph away.Listing and omitting differ twice over. A listed entry arrives with no
hiddenflag and therefore prints. And an omitted type skips theif (entry)section rewrite inwriter-opts.js, so a breaking commit of that type keeps its raw type string as the group title — wherecommitGroupOrder.indexOf()returns-1and sorts it above Features:The decision to omit still stands, but on different grounds: this is not a
styleproblem. Twelve types in this history are unconfigured —playground(31),doc(23),style(22),playgrounds(12),cli(6),demo(2),core,ai, plus typos. Fixing one of twelve here would be arbitrary, so the general case is filed separately.No live defect either way: all 30 breaking commits so far are of configured types (
fix15,feat12,refactor2,chore1).Ordering
Section order is the config array's own order, so
Revertslands afterPerformanceand above the docs/tests/chore block. The earlier claim that it "follows the preset's own" was overstated — only the head matches; our tail (test, chore, ci, refactor, build) already diverged from the preset's and is untouched here.Two types sharing the
"Features"label merge into one heading, confirmed by running the real writer. Not new behaviour:chore,refactorandbuildhave all mapped to"Chore"since the pipeline was set up, and every shipped release renders one### Chore.Effect on the open release PR: none
Rendering release-please's own
buildNotesover the 60 unreleased commits with both configs:Byte-identical, and release-please will not even push —
manifest.jscompares bodies and returns early when they match. #356 keeps its version, headings and 59 bullets. Version arithmetic is untouched:changelog-sectionsis not an input to it.Type of change, and the checklist
Retitled from
fix(release):toci(release):. Squash-merging makes the PR title the commit subject, andfixwould file this under### Bug Fixesin the shipped 2.12.0 notes beside real component fixes — misleading, sincerelease-please-config.jsonis not in the published package'sfiles. The repo's precedent for release-pipeline work isci:(#327 sits under### CI).The documentation checkbox is unticked: this changes one file by two lines and touches no docs. The
revert:-subject documentation is filed as follow-up.Checklist